package com.glp.work.flow.workflow.plugin.flowable.service;

import com.github.pagehelper.PageInfo;
import com.glp.work.flow.pojo.FlowTaskDto;
import com.glp.work.flow.request.FlowTaskHistoryDTO;
import com.glp.work.flow.response.UserTaskDto;
import com.glp.work.flow.workflow.plugin.flowable.dto.FlowDataListDTO;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskInfo;
import org.flowable.task.api.history.HistoricTaskInstance;

import java.util.List;
import java.util.Map;

/**
 * 工作流任务操作类
 *
 * @author Pan Wang
 * @date: 2020/03/13
 */
public interface FlowTaskService {

    /**
     * 启动流程
     *
     * @param procDefKey 流程定义KEY
     * @param businessId 业务表ID
     * @param vars       变量列表
     * @param userNo     用户编码（统一用户）
     * @return
     */
    String startProcess(String procDefKey, String businessId, Map<String, Object> vars, String userNo);

    /**
     * 启动流程
     *
     * @param procDefKey 流程定义KEY
     * @param businessId 业务表ID
     * @param vars       变量列表
     * @param userNo     用户编码（统一用户）
     * @param deptNo     用户部门
     * @param roleNos    角色编码列表
     * @return
     */
    String startProcess(String procDefKey, String businessId, Map<String, Object> vars, String userNo, String deptNo, List<String> roleNos);

    /**
     * 启动流程
     *
     * @param procDefKey 流程定义KEY
     * @param businessId 业务表ID
     * @param formData   自定义表单数据
     * @param vars       变量列表
     * @param userNo     用户编码（统一用户）
     * @param deptNo     用户部门
     * @param roleNos    角色编码列表
     * @return
     */
    String startProcess(String procDefKey, String businessId, Object formData, Map<String, Object> vars, String userNo, String deptNo, List<String> roleNos);


    /**
     * 用户审批
     *
     * @param flowTaskDto 需要传入的字段：
     *                    procInsId 流程实例ID
     *                    assignee 审批人
     *                    isPass 是否通过
     *                    formData 缓存工作流数据
     *                    comment 审批备注
     */
    String userAudit(FlowTaskDto flowTaskDto);

    /**
     * 删除任务
     *
     * @param taskId       任务ID
     * @param deleteReason 删除原因
     */
    void deleteTask(String taskId, String deleteReason);

    /**
     * 签收任务
     *
     * @param taskId 任务ID
     * @param userNo 签收用户ID（用户登录名）
     */
    void claim(String taskId, String userNo);

    /**
     * 委托任务
     *
     * @param taskId
     * @param userNo
     */
    void delegateTask(String taskId, String userNo);


    /**
     * 转派
     *
     * @param taskId
     * @param userNo
     * @param reason
     */
    void transferTask(String taskId, String userNo, String reason);

    /**
     * 取消签收任务
     *
     * @param taskId 任务ID
     * @param userNo 签收用户ID（用户登录名）
     */
    void unclaim(String taskId, String userNo);

    /**
     * 提交任务, 并保存意见
     *
     * @param flowTaskDto
     * @param vars        任务变量
     */
    void complete(FlowTaskDto flowTaskDto, Map<String, Object> vars);

    /**
     * 获取待办列表
     *
     * @param flowDataListDto:pageSize和PageNum初始传入
     * @param flowTaskDto
     * @param userNo
     * @return
     */
    FlowDataListDTO<FlowTaskDto> queryTodoList(FlowDataListDTO<FlowTaskDto> flowDataListDto, FlowTaskDto flowTaskDto, String userNo);

    /**
     * 获取待办列表
     *
     * @param flowDataListDto，pageSize和PageNum初始传入
     * @param flowTaskDto
     * @param userNo
     * @param sessionRoleCodes
     * @param needFormData
     * @return
     */
    FlowDataListDTO<FlowTaskDto> queryTodoList(FlowDataListDTO<FlowTaskDto> flowDataListDto, FlowTaskDto flowTaskDto, String userNo, List<String> roleNos, boolean needFormData);

    /**
     * 查询单个任务
     *
     * @param taskId
     * @return
     */
    FlowTaskDto getTaskById(String taskId);

    /**
     * 获取下个审批任务
     *
     * @param processId
     * @return
     * @throws Exception
     */
    FlowTaskDto getNextTask(String processId);

    /**
     * 获取发起任务
     *
     * @param flowDataListDto
     * @param flowTaskDto
     * @param userNo
     * @return
     */
    FlowDataListDTO<FlowTaskDto> querySendedList(FlowDataListDTO<FlowTaskDto> flowDataListDto, FlowTaskDto flowTaskDto, String userNo);

    /**
     * 获取已办任务
     *
     * @param flowDataListDto
     * @param flowTaskDto
     * @param userNo
     * @return
     */
    FlowDataListDTO<FlowTaskDto> queryHistoryTaskList(FlowDataListDTO<FlowTaskDto> flowDataListDto, FlowTaskDto flowTaskDto, String userNo);

    /**
     * 获取流转历史列表
     *
     * @param procInsId
     * @return
     */
    List<FlowTaskHistoryDTO> queryTaskHistories(String procInsId);



    /**
     * 查询实例的所有用户任务
     *
     * @param procInsId
     * @return
     */
    List<UserTaskDto> queryProcessUserTasks(String procInsId);

    /**
     * 获取流程表单（首先获取任务节点表单KEY，如果没有则取流程开始节点表单KEY）
     *
     * @param procDefId
     * @param taskDefKey
     * @return
     */
    String getFormKey(String procDefId, String taskDefKey);

    /**
     * 获取流程实例对象
     *
     * @param procInsId
     * @return
     */
    ProcessInstance getProcIns(String procInsId);

    /**
     * 获取历史流程实例对象
     *
     * @param procInsId
     * @return
     */
    HistoricProcessInstance getHistoryProcIns(String procInsId);


    /**
     * 获取任务
     *
     * @param taskId 任务ID
     * @return
     */
    Task getTask(String taskId);

    /**
     * 获取历史任务
     *
     * @param taskId 任务ID
     * @return
     */
    HistoricTaskInstance getHistoryTask(String taskId);

    /**
     * 获取任务
     *
     * @param taskId 任务ID
     * @return
     */
    TaskInfo getTaskOrHistoryTask(String taskId);


    /**
     * 获取历史任务
     *
     * @param procInsId 流程实例ID
     * @return
     */
    HistoricTaskInstance getHistoryTaskByProcessInstanceId(String procInsId);

    /**
     * 查询业务表ID
     *
     * @param procInsId
     * @return
     */
    String getBusinessKeyId(String procInsId);

    /**
     * 分页查询待办任务
     *
     * @param userNo
     */
    PageInfo<Task> pageQueryToDoTaskList(String userNo, Integer pageNum, Integer pageSize);

    /**
     * 分页查询已办任务
     *
     * @param userNo
     */
    PageInfo<HistoricTaskInstance> pageQueryDoneTaskList(String userNo, Integer pageNum, Integer pageSize);

    /**
     * 释放已领取的任务
     *
     * @param taskId
     */
    void unclaim(String taskId);

    /**
     * 结束当前流程实例
     *
     * @param
     */
    void endProcess(String processInstId, String executionId, Map<String, Object> vars);

    /**
     * 驳回到上一节点
     *
     * @param procInsId
     * @param executionId
     */
    public void rejectToUpperTask(String procInsId, String executionId, String assigneeName, Map<String, Object> vars);

    /**
     * @description : 驳回
     * @params : [procInsId, executionId, assigneeName, vars]
     * @returns : void
     * @author : 郭永伟
     * @date : 2020/9/25
     */
    public void rejectToTask(String procInsId, String executionId, String assigneeName, Map<String, Object> vars);

    /**
     * 根据展示级别，查询审批历史
     *
     * @param processId
     * @param showLevel
     * @return
     */
    List<FlowTaskHistoryDTO> queryHistoriesOfLevel(String processId, String showLevel);

    /**
     * @description : 获取当前任务候选人
     * @author : 郭永伟
     * @Param
     * @date : 2021/1/27
     */
    List<String> getCandidate(Task task);
}
